package persistence;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import persistence.PoolConexiones;
import model.*;

public class PersistenciaTarifa {
	
	private static PersistenciaTarifa instancia;
	
	public static PersistenciaTarifa getInstancia()
	{
		if (instancia== null)
			instancia =new PersistenciaTarifa();
		return instancia;
	}

	public Tarifa getTarifa(Integer id) //HECHO
	{
		Tarifa t = null; 
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, codigo, nombre, id_hotel, moneda, pension, activa, "
					+ "vig_desde, vig_hasta, id_prov "
					+ "FROM Tarifa "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				t = new Tarifa(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, PersistenciaHotel.getInstancia().getHotel(result.getInt("id_hotel"))
						, result.getString("moneda")
						, result.getString("pension")
						, result.getBoolean("activa")
						, result.getDate("vig_desde")
						, result.getDate("vig_hasta")
						, PersistenciaProveedor.getInstancia().getProveedor(result.getInt("id_prov"))
						, this.getTemporadas(result.getInt("id")) 
						);
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return t;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Tarifa: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return t;
	}
	
	public ArrayList<Tarifa> getTarifas() //HECHO
	{
		Tarifa t = null; 
		ArrayList<Tarifa> listaTarifas = new ArrayList<Tarifa>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		try
		{
			String senten = "SELECT id, codigo, nombre, id_hotel, moneda, pension, activa, "
					+ "vig_desde, vig_hasta, id_prov "
					+ "FROM Tarifa ";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{						
				t = new Tarifa(
						result.getInt("id")
						, result.getString("codigo")
						, result.getString("nombre")
						, PersistenciaHotel.getInstancia().getHotel(result.getInt("id_hotel"))
						, result.getString("moneda")
						, result.getString("pension")
						, result.getBoolean("activa")
						, result.getDate("vig_desde")
						, result.getDate("vig_hasta")
						, PersistenciaProveedor.getInstancia().getProveedor(result.getInt("id_prov"))
						, this.getTemporadas(result.getInt("id")) 
						);
				listaTarifas.add(t);
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return listaTarifas;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Tarifas: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return listaTarifas;
	}
	
	public Tarifa insertTarifa(Tarifa t) //HECHO
	{
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		try
		{					
			senten = "INSERT INTO Tarifa (codigo, nombre, id_hotel, moneda, pension, "
					+ "activa, vig_desde, vig_hasta, id_prov) "
					+ "VALUES (?,?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setString(1, t.getCodigo());
			ps.setString(2, t.getNombre());
			ps.setInt(3, t.getHotel().getId());
			ps.setString(4, t.getMoneda());
			ps.setString(5, t.getPension());
			ps.setBoolean(6, t.getActiva());
			ps.setDate(7, new java.sql.Date(t.getVigenciaDesde().getTime()));
			ps.setDate(8, new java.sql.Date(t.getVigenciaHasta().getTime()));
			ps.setInt(9, t.getProveedor().getId());
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			t.setId(newId);
			
			//inserta temporada
			for(Temporada tempo : t.getTemporadas())
				this.insertTemporada(tempo, t.getId());
			
			
			return t;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al insertar Tarifa: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return t;
	}
	
	public Tarifa guardarTarifa(Tarifa t) //HECHO
	{
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		try
		{
			senten = "UPDATE Tarifa SET "
					+ "codigo = ?,"
					+ "nombre = ?,"
					+ "id_hotel = ?,"
					+ "moneda = ?,"
					+ "pension = ?,"
					+ "activa = ?,"
					+ "vig_desde = ?,"
					+ "vig_hasta = ?,"
					+ "id_prov = ? "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, t.getCodigo());
			ps.setString(2, t.getNombre());
			ps.setInt(3, t.getHotel().getId());
			ps.setString(4, t.getMoneda());
			ps.setString(5, t.getPension());	
			ps.setBoolean(6, t.getActiva());			
			ps.setDate(7, new java.sql.Date(t.getVigenciaDesde().getYear(), t.getVigenciaDesde().getMonth(), t.getVigenciaDesde().getDay()));
			ps.setDate(8, new java.sql.Date(t.getVigenciaHasta().getYear(), t.getVigenciaHasta().getMonth(), t.getVigenciaHasta().getDay()));	
			ps.setInt(9, t.getProveedor().getId());
			ps.setInt(10, t.getId());
			ps.execute();
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			
			//elimina temporada
			for(Temporada tempo : t.getTemporadas())
				this.eliminarTemporada(tempo);
			
			//inserta temporada
			for(Temporada tempo : t.getTemporadas())
				this.insertTemporada(tempo, t.getId());
			
			
			return t;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al actualizar Tarifa: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return t;
	}

	
	public Temporada insertTemporada(Temporada t, int id_tarifa){
		int newId=0;
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		String senten = null;
		try
		{					
			senten = "INSERT INTO Temporada (id_tarifa, uso_desde, uso_hasta) "
					+ "VALUES (?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten, Statement.RETURN_GENERATED_KEYS);
			ps.setInt(1, id_tarifa);
			ps.setDate(2, new java.sql.Date(t.getFechaDeUsoDesde().getTime()));
			ps.setDate(3, new java.sql.Date(t.getFechaDeUsoHasta().getTime()));
			ps.execute();
			ResultSet  generatedKeys = ps.getGeneratedKeys();
			if(generatedKeys.next())
			{	
				newId = generatedKeys.getInt(1);
			}
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			t.setId(newId);
			return t;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al insertar Temporada: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
		return t;
	}
	
	public ArrayList<Temporada> getTemporadas(Integer id_tarifa) //HECHO
	{		
		ArrayList<Temporada> temporadas = new ArrayList<Temporada>();
		Connection con = PoolConexiones.getPoolConexiones().getConnection();
		
		try
		{
			String senten = "SELECT id, id_tarifa, uso_desde, uso_hasta "
					+ "FROM Temporada "
					+ "WHERE id_tarifa = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, id_tarifa);
			ResultSet result = ps.executeQuery();
			
			while (result.next())
			{										
				temporadas.add(new Temporada(result.getInt("id")
								, result.getDate("uso_desde")
								, result.getDate("uso_hasta")
								, PersistenciaPrecioHabitacion.getInstancia().getPreciosHabitaciones(result.getInt("id"))));
			}			
			
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
			return temporadas;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al consultar Temporada: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	      return temporadas;
	}
	
	public void eliminarTemporada(Temporada tempo)
	{
		//eliminar precios de habitacion
		for(PrecioHabitacion ph : tempo.getPreciosPorHabitacion())
			PersistenciaPrecioHabitacion.getInstancia().eliminarPrecioHabitacion(ph, tempo.getId());
		
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "DELETE FROM Temporada "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,tempo.getId());	
			ps.executeUpdate();
			con.commit();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Temporada: " + e.getMessage());
				e.printStackTrace();
				try{
					if(con!=null)
			            con.rollback();
				}catch( SQLException e2){
					e2.printStackTrace();
				}
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}

	public ArrayList<PrecioHabitacion> getPreciosPorTemporadas(Integer id_temporada) //HECHO
	{
		ArrayList<PrecioHabitacion> precios = new ArrayList<PrecioHabitacion>();
		return precios;
	}

	public void eliminarTarifa(Tarifa t) //HECHO
	{
		for(Temporada tempo : t.getTemporadas())
			this.eliminarTemporada(tempo);
		
		Connection con = PoolConexiones.getPoolConexiones().getConnection();				
		try
		{
			String senten = "DELETE FROM Tarifa "
					+ "WHERE id = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,t.getId());	
			ps.execute();
			PoolConexiones.getPoolConexiones().realeaseConnection(con);
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Error al eliminar Tarifa: " + e.getMessage());
				e.printStackTrace();
				PoolConexiones.getPoolConexiones().realeaseConnection(con);
	      }
	}

}

